// 示例 1:

// 输入: s = "cbaebabacd", p = "abc"
// 输出: [0, 6]
// 解释:
// 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
// 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
//  示例 2:

// 输入: s = "abab", p = "ab"
// 输出: [0, 1, 2]
// 解释:
// 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
// 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
// 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

s = "abab", p = "ab"
s = "paa", p = "aa"
s = "cbaebabacd", p = "abc"



// var findAnagrams = function (s, p) {
//     p.split('').sort().join('')
//     let result = []
//     let len = s.length

//     for (let i = 0; i < len - p.length + 1; i++) {
//         let tem = s.slice(i, i + p.length).split('').sort().join('')
//         if (tem === p) {
//             result.push(i)
//         }
//     }
//     return result;
// };

var findAnagrams = function (s, p) {
    // 思路：准备两个频率数组，用来记录s和p中字母出现的次数，利用滑动窗口遍历s，当走到和p长度一样时比较两个频率数组是否相等，并记得要去掉首位，保证滑动窗口的长度始终等于p的长度
    let pLen = p.length, sLen = s.length;
    let res = [];

    let pCount = new Array(26).fill(0);
    let sCount = new Array(26).fill(0);

    for (let i = 0; i < pLen; i++) {
        pCount[p.charCodeAt(i) - 'a'.charCodeAt(0)]++
    }

    for (let i = 0; i < sLen; i++) {
        sCount[s.charCodeAt(i) - 'a'.charCodeAt(0)]++

        if (i >= pLen) {
            sCount[s.charCodeAt(i - pLen) - 'a'.charCodeAt(0)]--
        }

        if (arraysEqual(sCount, pCount)) {
            res.push(i - pLen + 1);
        }
    }

    return res;
}

function arraysEqual(arr1, arr2) {
    for (let i = 0; i < arr1.length; i++) {
        if (arr1[i] !== arr2[i]) return false;
    }
    return true;
}
console.log(findAnagrams(s, p));
